#include<linux/module.h>
#include<linux/gpio.h>
#include<linux/timer.h>

#define GPIO_PIN 21

static struct timer_list gpio_timer;

static void gpio_timer_fun(struct timer_list *t){
	// 实现led闪烁
	static bool gpio_state=0;

	gpio_state=!gpio_state;
	gpio_set_value(GPIO_PIN,gpio_state);

	mod_timer(&gpio_timer,jiffies+msecs_to_jiffies(200));
}

static int __init my_gpio_init(void){
	int ret;

	ret=gpio_request(GPIO_PIN,"GPIO_PIN_21");
	if(ret){
		printk(KERN_ERR "Failed to request GPIO PIN %d\n",GPIO_PIN);
		return ret;
	}

	// gpio分为输入口，和输出口
	ret = gpio_direction_output(GPIO_PIN,1);
	if(ret){
		printk(KERN_ERR "Failed to set GPIO PIN %d output\n",GPIO_PIN);
		gpio_free(GPIO_PIN);
		return ret;
	}

	timer_setup(&gpio_timer,gpio_timer_fun,0);

	
	mod_timer(&gpio_timer,jiffies+msecs_to_jiffies(200));


	printk("GPIO LED is opened\n");
	return 0;
}

static void __exit my_gpio_exit(void){
	gpio_set_value(GPIO_PIN,0);
	gpio_free(GPIO_PIN);
	printk("GPIO LED is closed\n");
}

module_init(my_gpio_init);
module_exit(my_gpio_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("zhuzonghui <puchuchen@outlook.com>");
MODULE_DESCRIPTION("this is open led");
